#定义一个类
class A(object):
    #类属性，直接在类中定义的属性是类属性
    #类属性可以通过类或者类的实例访问
    #一般情况下，存放公共的值用类属性
    count=0
    def __init__(self):
        #实例属性，通过实例对象添加的属性属于实例属性
        #   实力属性只能通过实例对象来访问和修改，类对象无法访问修改
        self.name="孙悟空"

    #实例方法
    #   在类中，以self作为第一个参数的方法都是实例方法
    #　　实例方法在调用时候，python会将对象作为self传入
    def test(self):
        print("这是test方法～～～",self)

    #在类内部使用@classmethod来修饰的方法属于类方法,类方法第一个参数是cls,也会被自动传递，cls就是当前的类
    #类方法和实例方法的区别，实例方法第一个参数是self,而类方法第一个参数是cls
    @classmethod
    def test2(cls):
        print("这是test2方法～～～是一个类方法",cls)

    #静态方法(和这个类本身并没有什么关系，他只是一个保存在当前类中的函数，一般都是一些工具方法）
    #在类中使用@staticmethod来修饰的方法属于静态方法，静态方法不需要指定任何默认参数，可以通过类或者实例去调用


    @staticmethod
    def test3():
        print("这是test3方法～～～是一个静态方法")
a=A()
A.count=100
#类属性只能通过类来修改，无法通过实例修改，实例修改的是自己的属性，而不是类属性
#实例属性，通过实例对象添加的属性属于实例属性
a.count=10
# print("A",A.count)
# print("a",a.count)
# print(a.__dict__)

#实例方法可以通过实例去调，当通过实例去调用的时候会自动将当前调用对象作为self传入
#a.test()
#实例方法也可以用类调，但是不会自动传self，只能手动传递self,这种写法和上面是等价的，但是一般没人这么写
#A.test(a)


#类方法可以通过对象调用，也可以通过类去调用
# a.test2()
# A.test2()

#静态方法和函数的区别，必须得通过类或者实例去调。不能直接test3()
A.test3()
a.test3()